﻿using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using Sinacor.Infra.UI.Controls.SmartClient;
using Sinacor.UI.Bovespa.Ordens.Presenter;
using Sinacor.UI.Bovespa.Ordens.Model;
using System.ComponentModel;
using Sinacor.Infra.UI.Common;
using Sinacor.Infra.Common.Validation;
using PSE.Framework.UI.Resources;
using System.Collections.ObjectModel;
using Sinacor.UI.Bovespa.Ordens.Model.Enum;
using Sinacor.UI.Bovespa.Clientes.View.SmartClient;
using Sinacor.UI.Bovespa.Clientes.Model;

namespace Sinacor.UI.Bovespa.Ordens.View.SmartClient
{
    /// <summary>
    /// Interaction logic for CancelamentoDistribuicao.xaml
    /// </summary>
    public partial class CancelamentoDistribuicao : SinacorWindow, ICancelamentoDistribuicao
    {
        #region Construtor

        #region Construtor Padrão
        public CancelamentoDistribuicao()
        {
            InitializeComponent();

            this.AfterInitialize += new RoutedEventHandler(CancelamentoDistribuicao_AfterInitialize);
        }
        #endregion

        #region CancelamentoDistribuicao_AfterInitialize
        void CancelamentoDistribuicao_AfterInitialize(object sender, RoutedEventArgs e)
        {
            this.ClearServiceErrors();
            this._presenter = new CancelamentoDistribuicaoPresenter(this);
            this.DataContext = this.CancelamentoDistribuicaoPresenter;
            this.datagridDistribuicao.NewItemType = typeof(Model.OrdemDistribuicao);
            this._presenter.CarregarTelaInicial();
        }
        #endregion

        #endregion

        #region Atributos

        private CancelamentoDistribuicaoPresenter _presenter;
        private PesquisaCliente _pesquisaClienteModel;
        private ModelCancelamentoDistribuicao _model;
        /// <summary>
        /// Váriavel auxiliar para preencher estilo
        /// </summary>
        private string _style = string.Empty;

        #endregion

        #region Propriedades

        public PesquisaCliente PesquisaClienteModel
        {
            get { return this._pesquisaClienteModel; }
            set { this._pesquisaClienteModel = value; }
        }

        public CancelamentoDistribuicaoPresenter CancelamentoDistribuicaoPresenter
        {
            get { return this._presenter; }
            set { this._presenter = value; }
        }

        private int? _codigoCliente;

        public int? CodigoCliente
        {
            get { return this._codigoCliente; }
            set { this._codigoCliente = value; }
        }

        private int? _codigoFilhote;

        public int? CodigoFilhote
        {
            get { return this._codigoFilhote; }
            set { this._codigoFilhote = value; }
        }

        #endregion
        
        #region Eventos

        #region BtnPesquisaCliente_Click
        private void BtnPesquisaCliente_Click(object sender, RoutedEventArgs e)
        {
            this.AbrirPesquisaClientes(false);
        }
        #endregion

        #region BtnPesquisarOrdens_Click
        private void BtnPesquisarOrdens_Click(object sender, RoutedEventArgs e)
        {
            CarregarOrdem();
        }
        #endregion

        #region BtnPesquisaFilhotes_Click
        private void BtnPesquisaFilhotes_Click(object sender, RoutedEventArgs e)
        {
            AbrirPesquisaClientes(true);
        }
        #endregion

        #region btnNovaBusca_Click
        private void btnNovaBusca_Click(object sender, RoutedEventArgs e)
        {
            this.LimparCliente();
            this.LimparFilhote();
            this.LimparGrid();
        }
        #endregion

        #region TxtFilhote_KeyUp
        private void TxtFilhote_KeyUp(object sender, KeyEventArgs e)
        {
            if (TxtFilhote.Text.Length > 0)
            {
                ChkExcluirFilhote.IsEnabled = true;
            }
            else
            {
                ChkExcluirFilhote.IsChecked = false;
                ChkExcluirFilhote.IsEnabled = false;
            }
        }
        #endregion

        #region TxtFilhote_LostFocus
        private void TxtFilhote_LostFocus(object sender, RoutedEventArgs e)
        {
            this.ClearServiceErrors();
            Model.Parameter.ValidarFilhoteRequest parametroFilhote = new Sinacor.UI.Bovespa.Ordens.Model.Parameter.ValidarFilhoteRequest();
            Model.Parameter.ConsultarClienteApelidoRequest parametroCliente = new Sinacor.UI.Bovespa.Ordens.Model.Parameter.ConsultarClienteApelidoRequest();
            Model.Cliente resultadoCliente = null;


            if (TxtFilhote.Text.Trim() != "")
            {
                parametroCliente.Apelido = TxtFilhote.Text.Trim();
                resultadoCliente = this._presenter.ConsultarClienteApelido(parametroCliente);
                if (resultadoCliente != null)
                {
                    parametroFilhote.CodigoFilhote = resultadoCliente.Codigo.Value;
                    parametroFilhote.CodigoCliente = (resultadoCliente.ClienteBroker.HasValue) ? resultadoCliente.ClienteBroker.Value: 0;
                    parametroFilhote.DataPregao = Convert.ToDateTime(CmbPregao.Text);
                    this._presenter.ValidarFilhote(parametroFilhote);
                    CodigoFilhote = resultadoCliente.Codigo.Value;
                    CodigoCliente = resultadoCliente.ClienteBroker.Value;
                }
            }




        }
        #endregion

        #region TxtApelido_KeyUp
        private void TxtApelido_KeyUp(object sender, KeyEventArgs e)
        {
            if (TxtApelido.Text.Trim() == "")
            {
                TxtCliente.Text = "";
            }
        }
        #endregion

        #region datagridDistribuicao_ApplyingStyle
        private void datagridDistribuicao_ApplyingStyle(object sender, ApplyStyleEventArgs e)
        {

            if (e.ItemInfo.Item != null)
            {
                // Limpando style
                _style = string.Empty;

                if (e.OriginalSource is BaseRow)
                {
                    // BaseRow para estilos de linha
                    this.CancelamentoDistribuicaoPresenter.VerificarStatusOrdemDistribuicao((Model.OrdemDistribuicao)e.ItemInfo.Item);
                }

                // Retornando style
                e.Style = _style;
            }


        }
        #endregion

        #region Cancelar Distribuição
        private void SinacorContextMenuItem_Click(object sender, RoutedEventArgs e)
        {            
             CancelarOrdemDistribuidaSel();            
        }
        #endregion

        #endregion

        #region Métodos

        #region Privados

        #region CarregarOrdem
        private void CarregarOrdem()
        {

            this._model = new ModelCancelamentoDistribuicao();

            this._model.Apelido = TxtApelido.Text;
            this._model.Cliente = TxtCliente.Text;
            this._model.Pregao = Convert.ToDateTime(CmbPregao.Text);

            if (TxtFilhote.Text.Trim() != "")
                this._model.Filhote = TxtFilhote.Text;

            if (ChkExcluirFilhote.IsChecked.Value)
                this._model.ExcluirFilhote = true;

            if (CmbOperador.SelectedItem != null)
                this._model.CodigoOperador = ((Model.Operador)CmbOperador.SelectedItem).CodigoOperador;


                this._presenter.ConsultarOrdem(this._model);

        }
        #endregion

        #region CancelarOrdemDistribuidaSel

        private void CancelarOrdemDistribuidaSel()
        {
            ModelCollection<Model.OrdemDistribuida> parameters;
            Model.OrdemDistribuida pCancelarOrdemDistribuida;

            if (datagridDistribuicao.SelectedItems.Count > 0)
            {
                parameters = new ModelCollection<Model.OrdemDistribuida>();

                foreach (Model.OrdemDistribuicao item in datagridDistribuicao.SelectedItems)
                {
                    item.ClearErrors();

                    pCancelarOrdemDistribuida = new Model.OrdemDistribuida();

                    pCancelarOrdemDistribuida.CodigoFilhote = (CodigoFilhote.HasValue && ChkExcluirFilhote.IsChecked.Value) ? CodigoFilhote.Value : 0;
                    pCancelarOrdemDistribuida.DataOrdem = item.DataOrdem;
                    pCancelarOrdemDistribuida.DataPregao = item.DataPregao;
                    pCancelarOrdemDistribuida.NumeroConjunto = item.NumeroConjunto;
                    pCancelarOrdemDistribuida.NumeroOrdem = item.NumeroOrdem;
                    pCancelarOrdemDistribuida.NumeroOrdemSubSequencia = item.NumeroOrdemSubSequencia;

                    if (CodigoFilhote.HasValue && ChkExcluirFilhote.IsChecked.Value)
                    {
                        pCancelarOrdemDistribuida.TipoCancelamento = "F";
                    }
                    else
                    {
                        pCancelarOrdemDistribuida.TipoCancelamento = "T";
                    }

                    pCancelarOrdemDistribuida.CodigoBroker = item.CodigoBroker;
                    pCancelarOrdemDistribuida.Bolsa = item.Bolsa;
                    pCancelarOrdemDistribuida.Titulo = item.Titulo;
                    pCancelarOrdemDistribuida.NumeroNegocio = item.NumeroNegocio;
                    pCancelarOrdemDistribuida.NaturezaOperacao = item.NaturezaOperacao;

                    pCancelarOrdemDistribuida.Identificador = item.Identificador;

                    parameters.Add(pCancelarOrdemDistribuida);
                }

                this.ClearServiceErrors();

                this._presenter.CancelarOrdemDistribuida(parameters);
            }
            else
            {
                SinacorMessageBox.Show((string)ResourceProviderManager.GetResourceProvider().TryGetResource("Bovespa.Ordens.Message.OrdemDistribuidaObrigatoria"), SinacorMessageBoxImage.Exclamation);
            }
        }

        #endregion

        #endregion

        #region Públicos

        #region InformarMensagemSemResultado
        public void InformarMensagemSemResultado()
        {
            SinacorMessageBox.Show((string)ResourceProviderManager.GetResourceProvider().TryGetResource("Bovespa.Ordens.Message.ConsultarOrdemSemResultado"), SinacorMessageBoxImage.Information);
        }
        #endregion

        #region ApresentarCalendario
        public void ApresentarCalendario()
        {
            this.CmbPregao.Items.Clear();
            this.CmbPregao.UpdateTarget(SinacorComboBox.ItemsSourceProperty);
        }
        #endregion

        #region ApresentarOperador
        public void ApresentarOperador()
        {
            this.CmbOperador.Items.Clear();
            this.CmbOperador.UpdateTarget(SinacorComboBox.ItemsSourceProperty);
        }
        #endregion

        #region ApresentarOrdem
        public void ApresentarOrdem()
        {
            datagridDistribuicao.UpdateTarget(SinacorDataGrid.ItemsSourceProperty);
        }
        #endregion

        #region ApresentarOrdem
        public void ApresentarOrdem(IEnumerable ordens)
        {
            this.LimparGrid();
            this.datagridDistribuicao.ItemsSource = ordens;
        }
        #endregion

        #region InformarCancelamentoEfetuado
        public void InformarCancelamentoEfetuado()
        {
            SinacorMessageBox.Show((string)ResourceProviderManager.GetResourceProvider().TryGetResource("Bovespa.Ordens.Message.CancelamentoOrdemDistSucess"), SinacorMessageBoxImage.Information);
        }
        #endregion

        #region ApresentarViewConsultarCliente
        public void ApresentarViewConsultarCliente() 
        {
 
        }
        #endregion

        #region IniciarProcesso
        public void IniciarProcesso()
        {
            this.ShowUserWaitingProcess();
        }
        #endregion

        #region FinalizarProcesso
        public void FinalizarProcesso()
        {
            this.HideUserWaitingProcess();
        }
        #endregion

        #region DesabilitarCancelamento
        public void DesabilitarCancelamento()
        {
            SinacorMessageBox.Show((string)ResourceProviderManager.GetResourceProvider().TryGetResource("Bovespa.Ordens.ExceptionMessage.SemPermissaoCancelamento"), SinacorMessageBoxImage.Exclamation);
            IsEnableCancel = false;

            this.Close();
        }
        #endregion

        #region HabilitarCancelamento
        public void HabilitarCancelamento()
        {
            IsEnableCancel = true;

        }
        #endregion

        #region AbrirPesquisaClientes
        public void AbrirPesquisaClientes(Boolean bFilhote)
        {
            this.ClearServiceErrors();
            PesquisaClientes pesquisaClientes = new PesquisaClientes();
            this.PesquisaClienteModel = new PesquisaCliente();

            Model.Parameter.ValidarFilhoteRequest pValidarFilhote = null;

            if (bFilhote)
            {
                PesquisaClienteModel.Apelido = TxtFilhote.Text;
            }
            else
            {
                PesquisaClienteModel.Apelido = TxtApelido.Text;
            }

            pesquisaClientes.CarregaParametros(Sinacor.UI.Bovespa.Clientes.Model.Enum.JanelaChamada.CancelamentoDistribuicao, this.PesquisaClienteModel);
            pesquisaClientes.Owner = this;
            pesquisaClientes.SetMenuHeader("Bovespa.Clientes.Label.PesquisaClientesMenuHeader");
            pesquisaClientes.ShowDialog();

            if (pesquisaClientes.PesquisaClienteModel.Codigo > 0)
            {
                if (bFilhote)
                {
                    TxtFilhote.Text = pesquisaClientes.PesquisaClienteModel.Apelido;
                    if (CodigoCliente.HasValue)
                    {
                        pValidarFilhote = new Sinacor.UI.Bovespa.Ordens.Model.Parameter.ValidarFilhoteRequest();
                        pValidarFilhote.CodigoCliente = CodigoCliente.Value;
                        pValidarFilhote.CodigoFilhote = pesquisaClientes.PesquisaClienteModel.Codigo.Value;
                        pValidarFilhote.DataPregao = Convert.ToDateTime(CmbPregao.Text);
                        this._presenter.ValidarFilhote(pValidarFilhote);
                        CodigoFilhote = pValidarFilhote.CodigoFilhote;
                        ChkExcluirFilhote.IsEnabled = true;
                    }
                }
                else
                {



                    CodigoCliente = pesquisaClientes.PesquisaClienteModel.Codigo;
                    this.PesquisaClienteModel.Apelido = pesquisaClientes.PesquisaClienteModel.Apelido;
                    this.PesquisaClienteModel.NomeCliente = pesquisaClientes.PesquisaClienteModel.NomeCliente;
                    this.PesquisaClienteModel.ComplementoNome = pesquisaClientes.PesquisaClienteModel.ComplementoNome;
                    this.PesquisaClienteModel.Codigo = pesquisaClientes.PesquisaClienteModel.Codigo;
                    this.PesquisaClienteModel.CodigoOperacionalCVM = pesquisaClientes.PesquisaClienteModel.CodigoOperacionalCVM;

                    TxtApelido.Text = this.PesquisaClienteModel.Apelido;
                    TxtCliente.Text = String.Concat(this.PesquisaClienteModel.NomeCliente, " ", this.PesquisaClienteModel.ComplementoNome);

                    if (CodigoFilhote.HasValue)
                    {
                        pValidarFilhote = new Sinacor.UI.Bovespa.Ordens.Model.Parameter.ValidarFilhoteRequest();
                        pValidarFilhote.CodigoCliente = CodigoCliente.Value;
                        pValidarFilhote.CodigoFilhote = CodigoFilhote.Value;
                        pValidarFilhote.DataPregao = Convert.ToDateTime(CmbPregao.Text);
                        this._presenter.ValidarFilhote(pValidarFilhote);
                        ChkExcluirFilhote.IsEnabled = true;
                    }
                }
            }
        }
        #endregion

        #region ApresentarDistribuidaParcial
        public void ApresentarDistribuidaParcial()
        {
            _style = BaseRow.GridRowBusiness04;
        }
        #endregion

        #region ApresentarDistribuidaTotal
        public void ApresentarDistribuidaTotal()
        {
            _style = BaseRow.GridRowBusiness02;
        }
        #endregion

        public void InformarCancelamentoEfetuadoErros()
        {
            SinacorMessageBox.Show(this.FindResource("Bovespa.Ordens.Message.CancelamentoOrdemComErros").ToString(),
                                   SinacorMessageBoxButton.Ok,
                                   SinacorMessageBoxImage.Exclamation);
        }

        #endregion

        #endregion

        #region Menu Properties


        private bool _IsEnableCancel;
        public bool IsEnableCancel
        {
            get {return _IsEnableCancel;}
            set {
                if (value != this._IsEnableCancel)
                {
                    _IsEnableCancel = value;
                    NotifyPropertyChanged("IsEnableCancel");                    
                }
            
            }
        }


        public void LimparCliente()
        {
            this.TxtApelido.Text = "";
            this.TxtCliente.Text = "";
            this.CodigoCliente = null;

            this.TxtApelido.UpdateLayout();
            this.TxtCliente.UpdateLayout();
        }
        public void LimparFilhote()
        {
            TxtFilhote.Text = "";
            CodigoFilhote = null;

            TxtFilhote.UpdateLayout();
        }
        public void LimparGrid()
        {
            this.datagridDistribuicao.ItemsSource = null;
            this.datagridDistribuicao.UpdateLayout();
        }

        public event PropertyChangedEventHandler PropertyChanged;

        private void NotifyPropertyChanged(String info)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(info));
            }
        }


        #endregion
    }
}
